home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 51 / Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso / -in_the_mag- / banging_the_metal / qdos / qdos4amiga2 / romsrc / snd / snd_asm
Text File  |  2000-01-03  |  13KB  |  634 lines

  1.     SECTION SND
  2.  
  3.     INCLUDE '/INC/QDOS_inc'
  4.     INCLUDE '/INC/AMIGA_inc'
  5.     INCLUDE '/INC/AMIGQDOS_inc'
  6.  
  7. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  8. ; SND1_asm - sound routines
  9. ;      - last modified 27/07/94
  10.  
  11. ; These are all the necessary sound related sources, required
  12. ; to implement a QDOS BEEP on the Amiga computer.
  13.  
  14. ;  ...latest changes by Mark J Swift
  15.  
  16. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  17. ;  ROM header
  18.  
  19. BASE:
  20.     dc.l    $4AFB0001    ; ROM recognition code
  21.     dc.w    0        ; add BASIC procs here
  22.     dc.w    ROM_START-BASE
  23.     dc.b    0,32,'Amiga-QDOS SOUND routines v1.06',$A
  24.  
  25. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26. ;  start of ROM code
  27.  
  28. ROM_START:
  29.     movem.l d0-d3/a0-a3,-(a7)
  30.  
  31. ; --------------------------------------------------------------
  32. ;  allocate memory for sound variables
  33.  
  34.     move.l    #BV_LEN,d1
  35.     moveq    #MT.ALCHP,d0
  36.     moveq    #0,d2
  37.     trap    #1
  38.  
  39. ; --------------------------------------------------------------
  40. ;  address of sound variables
  41.  
  42.     move.l    a0,AV.SNDV
  43.     move.l    a0,a3
  44.  
  45. ; --------------------------------------------------------------
  46. ;  enter supervisor mode and disable interrupts
  47.  
  48.     trap    #0
  49.  
  50.     ori.w    #$0700,sr    ; disable interrupts
  51.  
  52. ; --------------------------------------------------------------
  53. ;  link a custom routine into level 7 interrupt server
  54.  
  55.     lea    AV.LVL7link,a1
  56.     lea    BV.LVL7link(a3),a2
  57.  
  58.     move.l    (a1),(a2)
  59.     move.l    a2,(a1)
  60.  
  61.     lea    MY_LVL7(pc),a1
  62.     move.l    a1,$04(a2)
  63.  
  64. ; --------------------------------------------------------------
  65. ;  link a custom routine into Trap #1 exception
  66.  
  67.     lea    AV.TRP1link,a1
  68.     lea    BV.TRP1link(a3),a2
  69.  
  70.     move.l    (a1),(a2)
  71.     move.l    a2,(a1)
  72.  
  73.     lea    MY_TRP1(pc),a1
  74.     move.l    a1,$04(a2)
  75.  
  76. ; --------------------------------------------------------------
  77. ;  initialise relevant hardware
  78.  
  79.     bsr    INIT_HW
  80.  
  81. ; -------------------------------------------------------------
  82. ; link in external interrupt to act on sound cycle complete
  83.  
  84.     lea    XINT_SERver(pc),a1 ; address of routine
  85.     lea    BV.XINTLink(a3),a0
  86.     move.l    a1,4(a0)
  87.     moveq    #MT.LXINT,d0
  88.     trap    #1
  89.  
  90. ; --------------------------------------------------------------
  91. ;  enable interrupts and re-enter user mode
  92.  
  93.     andi.w    #$D8FF,sr
  94.  
  95. ; --------------------------------------------------------------
  96. ;  initiate a sound process
  97.  
  98.     movem.l    d5/d7,-(a7)
  99.  
  100.     lea    BLIP(pc),a3
  101.     moveq    #$11,d0
  102.     trap    #1
  103.  
  104.     movem.l    (a7)+,d5/d7
  105.  
  106. ; --------------------------------------------------------------
  107. ROM_EXIT:
  108.     movem.l (a7)+,d0-d3/a0-a3
  109.     rts
  110.  
  111. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  112. ;  initialise sound for use.
  113.  
  114. INIT_HW:
  115.     movem.l d0-d2/a0/a3,-(a7)
  116.  
  117. ; --------------------------------------------------------------
  118. ;  initialise hardware
  119.  
  120.     move.w    #%0000000010000000,INTENA ; disable AUD0 ints
  121.     move.w    #$000F,DMACONW            ; kill sound
  122.     move.w    #%0000000010000000,INTREQ ; clear AUD0 ints
  123.  
  124.     move.l    a7,d0
  125.     andi.l    #$FFFF8000,d0
  126.     move.l    d0,a0        ; Calc address of sys vars
  127.  
  128.     move.b    #0,SV_SOUND(a0)    ; signal as not beeping
  129.  
  130.     movem.l (a7)+,d0-d2/a0/a3
  131.     rts
  132.  
  133. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  134. ;  external interrupt server
  135.  
  136. XINT_SERver:
  137.     movem.l    d7/a0,-(a7)
  138.  
  139.     move.w    INTENAR,d7    ; read interrupt enable reg
  140.     btst    #7,d7        ; branch if AUD0 ints not on
  141.     beq    XINT_OTHer
  142.  
  143.     move.w    INTREQR,d7    ; read interrupt request reg
  144.     btst    #7,d7        ; branch if from AUD0
  145.     bne    AUD0_SERV
  146.  
  147. ; --------------------------------------------------------------
  148. ;  otherwise let another external interrupt server handle it
  149.  
  150. XINT_OTHer:
  151.     movem.l    (a7)+,d7/a0
  152.     rts
  153.  
  154. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  155. ;  Interrupt from AUD0
  156.  
  157. AUD0_SERV:
  158.     move.l    a7,d7
  159.     andi.l    #$FFFF8000,d7
  160.     move.l    d7,a0        ; Calc address of sys vars
  161.  
  162.     tst.b    SV_SOUND(a0)    ; are we beeping?
  163.     beq.s    XINT_OTHer    ; no.
  164.  
  165.     move.w    #%0000000010000000,INTREQ ; clear interrupts
  166.  
  167.     movem.l    d1-d4/a0/a1,-(a7)
  168.  
  169.     move.l    AV.SNDV,a1
  170.  
  171.     moveq    #0,d0
  172.     move.w    BV.BEEP(a1),d0    ; previous pitch
  173.     move.l    d0,d2
  174.     add.w    #11,d2        ; calc. length of sample
  175.     lsl.l    #4,d2        ; scale it
  176.     add.l    d0,d2
  177.  
  178.     move.l    BV.DURVAL(a1),d1
  179.     beq.s    AUD0_L1        ; infinite dur.
  180.  
  181.     add.l    d2,BV.DURCNT(a1)    ; increment dur count
  182.     move.l    BV.DURCNT(a1),d3
  183.     cmp.l    d3,d1
  184.     ble    AUD0_DONe    ; finished?
  185.  
  186. AUD0_L1:
  187.     move.w    BV.NOTE(a1),d0    ; calculated pitch
  188.  
  189.     move.l    BV.GRDVAL(a1),d1
  190.     beq    AUD0_G3        ; no sequence duration
  191.  
  192.     add.l    d2,BV.GRDCNT(a1)    ; increment pitch count
  193.     move.l    BV.GRDCNT(a1),d2
  194.     cmp.l    d2,d1
  195.     bgt    AUD0_G3        ; still counting...
  196.  
  197.     move.w    BV.PITCH(a1),d0    ; ideal pitch
  198.  
  199. AUD0_LUP:
  200.     tst.w    BV.PITINC(a1)
  201.     beq    AUD0_G1        ; no pitch increment
  202.  
  203.     add.w    BV.PITINC(a1),d0
  204.  
  205.     tst.w    BV.PITINC(a1)
  206.     bmi.s    AUD0_P2
  207.  
  208. AUD0_P1:
  209.     move.w    BV.PITCH2(a1),d3
  210.     cmp.w    d0,d3        ; reached limit?
  211.     bgt.s    AUD0_G1        ; no
  212.  
  213.     move.w    BV.REPCNT(a1),d4
  214.     dbra    d4,AUD0_R1
  215.  
  216.     move.w    BV.REPVAL(a1),d4
  217.     move.w    d4,BV.REPCNT(a1)
  218.     lsl.w    #1,d3
  219.     sub.w    d0,d3
  220.     move.w    d3,d0
  221.     neg.w    BV.PITINC(a1)    ; bounce
  222.  
  223.     bra.s    AUD0_P2
  224.  
  225. AUD0_R1:
  226.     move.w    d4,BV.REPCNT(a1)
  227.     sub.w    d3,d0
  228.     add.w    BV.PITCH1(a1),d0    ; repeat
  229.  
  230.     bra.s    AUD0_P1
  231.  
  232. AUD0_P2:
  233.     move.w    BV.PITCH1(a1),d3
  234.     cmp.w    d0,d3        ; reached limit?
  235.     blt.s    AUD0_G1        ; no
  236.  
  237.     move.w    BV.REPCNT(a1),d4
  238.     dbra    d4,AUD0_R2
  239.  
  240.     move.w    BV.REPVAL(a1),d4
  241.     move.w    d4,BV.REPCNT(a1)
  242.     lsl.w    #1,d3
  243.     sub.w    d0,d3
  244.     move.w    d3,d0
  245.     neg.w    BV.PITINC(a1)    ; bounce
  246.  
  247.     bra.s    AUD0_P1
  248.  
  249. AUD0_R2:
  250.     move.w    d4,BV.REPCNT(a1)
  251.     sub.w    d3,d0
  252.     add.w    BV.PITCH2(a1),d0    ; repeat
  253.  
  254.     bra.s    AUD0_P2
  255.  
  256. AUD0_G1:
  257.     sub.l    d1,d2
  258.     cmp.l    d2,d1
  259.     blt.s    AUD0_LUP
  260.  
  261.     move.l    d2,BV.GRDCNT(a1)
  262.     move.w    d0,BV.PITCH(a1)
  263.  
  264.     move.w    BV.RAND(a1),d1
  265.     beq.s    AUD0_G3
  266.  
  267.     move.w    BV.SEED(a1),d2
  268.     addq.w    #1,d2
  269.     mulu.w    #33,d2
  270.     divu    #257,d2
  271.     clr.w    d2
  272.     swap    d2
  273.     subq.w    #1,d2
  274.     andi.w    #$FF,d2
  275.     move.w    d2,BV.SEED(a1)    ; make a random number
  276.  
  277.     addq.w    #1,d1
  278.     divu    d1,d2
  279.     swap    d2
  280.     lsr.w    #1,d1
  281.     sub.w    d2,d1
  282.     add.w    d1,d0        ; RANDomise note
  283.     andi.w    #$00FF,d0
  284.  
  285. AUD0_G3:
  286.     bsr    SETBEEP        ; new sound params
  287.  
  288.     bra.s    AUD0_EXIt
  289.  
  290. AUD0_DONe:
  291.     bsr    INIT_HW
  292.  
  293. AUD0_EXIt:
  294.     movem.l    (a7)+,d1-d4/a0/a1
  295.  
  296. XINT_EXIt:
  297.     bra    XINT_OTHer
  298.  
  299. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  300. SETBEEP:
  301.     move.w    d0,BV.NOTE(a1)
  302.  
  303.     move.w    BV.FUZZ(a1),d1
  304.     beq.s    SETBEEP1
  305.  
  306.     move.w    BV.SEED(a1),d2
  307.     addq.w    #1,d2
  308.     mulu.w    #33,d2
  309.     divu    #257,d2
  310.     clr.w    d2
  311.     swap    d2
  312.     subq.w    #1,d2
  313.     andi.w    #$FF,d2
  314.     move.w    d2,BV.SEED(a1)    ; make a random number
  315.  
  316.     addq.w    #1,d1
  317.     divu    d1,d2
  318.     swap    d2
  319.     lsl.w    #2,d2
  320.     add.w    d2,d0
  321.     andi.w    #$00FF,d0
  322.  
  323. SETBEEP1:
  324.     move.w    d0,BV.BEEP(a1)
  325.  
  326.     move.w    d0,d1
  327.     addi.w    #11,d1        ; calc. length of sample
  328.  
  329.     move.w    d1,d0
  330.     lsr.w    #1,d0        ; calc. AUDXLEN
  331.     move.w    d0,AUD0LEN
  332.  
  333.     lea    SAMPLE,a0
  334.     lea    140(a0),a0    ; half way thro' sample
  335.     move.l    a0,d2
  336.     ext.l    d0
  337.     sub.l    d0,d2
  338.     bclr    #0,d2        ; calc. AUDXLC
  339.     move.l    d2,AUD0LC
  340.  
  341.     move.w    #313,d0        ; AUDXPER
  342.  
  343.     bclr    #0,d1        ; need to adjust AUDXPER?
  344.     beq.s    SETBEEP2     ; no.
  345.  
  346.     move.w    d0,d2
  347.     ext.l    d2
  348.     divu    d1,d2
  349.     add.w    d2,d0        ; calc. new AUDXPER
  350.  
  351. SETBEEP2:
  352.     move.w    d0,AUD0PER
  353.  
  354.     rts
  355.  
  356. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  357. ;  Custom LVL7 routine to initialise hardware
  358.  
  359. MY_LVL7:
  360.     bsr    INIT_HW
  361.  
  362.     subq.l    #4,a7
  363.     movem.l    a3,-(a7)
  364.     move.l    AV.SNDV,a3
  365.     move.l    BV.LVL7link(a3),a3
  366.     move.l    4(a3),4(a7)    ; address of next routine
  367.     movem.l    (a7)+,a3
  368.  
  369.     rts
  370.  
  371. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  372. ;  A patch to replace TRAP#1 calls to: MT_IPCOM (d0=$10 and $11)
  373.  
  374. MY_TRP1:
  375.     bsr    INI_A5A6
  376.  
  377.     cmp.b    #$11,d0
  378.     beq    MT_IPCOM
  379.  
  380. MY_TRP1X:
  381.     movem.l (a7)+,d7/a5/a6    ; restore registers
  382.  
  383.     subq.l    #4,a7
  384.     movem.l    a3,-(a7)
  385.     move.l    AV.SNDV,a3
  386.     move.l    BV.TRP1link(a3),a3
  387.     move.l    4(a3),4(a7)    ; address of next routine
  388.     movem.l    (a7)+,a3
  389.  
  390.     rts
  391.  
  392. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  393. ; initialise A5 and A6 prior to performing a TRAP routine
  394.  
  395. INI_A5A6
  396.     SUBQ.L    #8,A7
  397.     MOVE.L    8(A7),-(A7)
  398.     MOVEM.L D7/A5/A6,4(A7)
  399.  
  400.     move.l    a7,d7
  401.     andi.l    #$FFFF8000,d7
  402.     move.l    d7,a6        ; Calc address of sys vars
  403.  
  404.     LEA    4(A7),A5 ; A5 points to saved
  405.                 ; Registers D7,A5,A6
  406.     MOVEQ    #$7F,D7
  407.     AND.L    D7,D0
  408.     RTS
  409.  
  410. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  411. ;  TRAP #1 with D0=$11
  412.  
  413. MT_IPCOM:
  414.     cmp.b    #10,(a3) ; is IPC command initiate sound ?
  415.     beq.s    MT_IPC10
  416.  
  417.     cmp.b    #11,(a3)     ; is it kill sound ?
  418.     bne    MY_TRP1X     ; no
  419.  
  420. MT_IPC11:
  421.     bsr    INIT_HW
  422.  
  423.     moveq    #0,d0
  424.     bra    TRAP1_X        ; exit
  425.  
  426. MT_IPC10:
  427.     movem.l    d1-d2/a0-a2,-(a7)
  428.  
  429.     move.l    AV.SNDV,a1
  430.  
  431.     move.l    a3,a2
  432.  
  433.     cmp.b    #8,1(a3)
  434.     beq.s    IPC_SKP0
  435.  
  436. ; --------------------------------------------------------------
  437. ; change 16 parameter sound into an 8 parameter one
  438.  
  439.     lea    SAMPLE,a2
  440.  
  441.     move.b    $6(a3),$6(a2)
  442.     move.b    $8(a3),$7(a2)
  443.     move.w    $A(a3),$8(a2)
  444.     move.w    $C(a3),$A(a2)
  445.     move.b    $E(a3),d0
  446.     lsl.b    #4,d0
  447.     move.b    $10(a3),d1
  448.     andi.b    #$F,d1
  449.     or.b    d1,d0
  450.     move.b    d0,$C(a2)
  451.     move.b    $12(a3),d0
  452.     lsl.b    #4,d0
  453.     move.b    $14(a3),d1
  454.     andi.b    #$F,d1
  455.     or.b    d1,d0
  456.     move.b    d0,$D(a2)
  457.  
  458. ; --------------------------------------------------------------
  459. IPC_SKP0:
  460.     moveq    #0,d1
  461.     move.b    $6(a2),d1
  462.     sub.b    #1,d1        ; get PITCH1
  463.  
  464.     moveq    #0,d2
  465.     move.b    $7(a2),d2
  466.     sub.b    #1,d2        ; get PITCH2
  467.  
  468.     cmp.w    d1,d2
  469.     bge.s    IPC_SKP1
  470.  
  471.     exg    d1,d2
  472.  
  473. IPC_SKP1:
  474.     move.w    d1,BV.PITCH1(a1)
  475.     move.w    d2,BV.PITCH2(a1)
  476.  
  477. ; --------------------------------------------------------------
  478.     move.b    $9(a2),d0    ; gradient hi
  479.     lsl.w    #8,d0
  480.     move.b    $8(a2),d0    ; gradient lo
  481.     mulu    #14,d0
  482.     move.l    d0,BV.GRDVAL(a1)
  483.  
  484. ; --------------------------------------------------------------
  485.     move.b    $B(a2),d0    ; duration hi
  486.     lsl.w    #8,d0
  487.     move.b    $A(a2),d0    ; duration lo
  488.     mulu    #14,d0
  489.     move.l    d0,BV.DURVAL(a1)
  490.  
  491. ; --------------------------------------------------------------
  492.     moveq    #0,d0
  493.     move.b    $C(a2),d0    ; repeats
  494.     andi.b    #$0F,d0
  495.     move.w    d0,BV.REPVAL(a1)
  496.  
  497.     move.w    d0,BV.REPCNT(a1)
  498.  
  499. ; --------------------------------------------------------------
  500.     move.b    $C(a2),d0    ; get pitch increment
  501.     lsr.b    #4,d0
  502.     cmpi.b    #8,d0
  503.     bne.s    IPC_SKP5
  504.  
  505.     move.w    d1,d0
  506.     sub.w    d2,d0        ; maximise pitch inc
  507.     bra.s    IPC_SKP2
  508.  
  509. IPC_SKP5:
  510.     lsl.b    #4,d0
  511.     ext.w    d0
  512.     asr.w    #4,d0        ; sign extend
  513.  
  514.     tst.w    d0
  515.     bgt.s    IPC_SWP3
  516.  
  517. IPC_SKP2:
  518.     move.w    d2,BV.PITCH(a1)    ; current ideal value
  519.     bra.s    IPC_SWP4
  520.  
  521. IPC_SWP3:
  522.     move.w    d1,BV.PITCH(a1)    ; current ideal value
  523.  
  524. ; --------------------------------------------------------------
  525. IPC_SWP4:
  526.     cmp.w    d1,d2
  527.     bne.s    IPC_SWP5
  528.  
  529.     moveq    #0,d0
  530.  
  531. IPC_SWP5:
  532.     move.w    d0,BV.PITINC(a1)
  533.  
  534. ; --------------------------------------------------------------
  535.     moveq    #0,d0
  536.     move.b    $D(a2),d0    ; fuzz
  537.     andi.b    #$F,d0
  538.     subq.w    #$7,d0        ; make 0-8
  539.     bge.s    IPC_SKP3
  540.  
  541.     clr.w    d0
  542.  
  543. IPC_SKP3:
  544.     move.w    d0,BV.FUZZ(a1)
  545.  
  546. ; --------------------------------------------------------------
  547.     moveq    #0,d0
  548.     move.b    $D(a2),d0    ; randomness
  549.     lsr.b    #4,d0
  550.     subq.w    #$7,d0        ; make 0-8
  551.     bge.s    IPC_SKP4
  552.  
  553.     clr.w    d0
  554.  
  555. IPC_SKP4:
  556.     move.w    d0,BV.RAND(a1)
  557.  
  558.     clr.l    BV.DURCNT(a1)
  559.     clr.l    BV.GRDCNT(a1)
  560.     clr.w    BV.SEED(a1)
  561.  
  562. ; --------------------------------------------------------------
  563.     lea    SAMPLE,a0
  564.     lea    BEEPBEG(pc),a2
  565.     move.w    #((BEEPEND-BEEPBEG)/2-1),d0
  566.  
  567. MOVSNDLUP:
  568.     move.w    (a2)+,(a0)+
  569.     dbra    d0,MOVSNDLUP
  570.  
  571. ; --------------------------------------------------------------
  572.     move.l    a7,d0
  573.     andi.l    #$FFFF8000,d0
  574.     move.l    d0,a0        ; Calc address of sys vars
  575.  
  576.     move.b    #$FF,SV_SOUND(a0) ; signal as beeping
  577.  
  578. ; --------------------------------------------------------------
  579.     move.w    #64,AUD0VOL    ; set volume
  580.     move.w    #$FF,ADKCON    ; no modulation
  581.  
  582.     move.w    BV.PITCH(a1),d0
  583.     bsr    SETBEEP
  584.  
  585. ; --------------------------------------------------------------
  586.     move.w    #%0000000010000000,INTREQ ; clear interrupts
  587.     move.w    #$8001,DMACONW            ; start sound
  588.     move.w    #%1000000010000000,INTENA ; enable interrupts
  589.  
  590.     movem.l    (a7)+,d1-d2/a0-a2
  591.     moveq    #0,d0
  592.     bra    TRAP1_X    ; exit
  593.  
  594. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  595. ;  exit from TRAP call
  596.  
  597. TRAP1_X    movem.l (a7)+,d7/a5/a6     ; exit from exception
  598.     rte
  599.  
  600. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  601. ;  BEEP sound sample, a square wave with rippled edges.
  602.  
  603. BEEPBEG:
  604.     DC.B $8D,$8B,$88,$86,$84,$83,$82,$81,$82,$83,$84,$86,$88,$8B,$8D,$8F
  605.     DC.B $90,$91,$91,$91,$90,$8F,$8D,$8B,$88,$86,$84,$83,$82,$81,$82,$83
  606.     DC.B $84,$86,$88,$8B,$8D,$8F,$90,$91,$91,$91,$90,$8F,$8D,$8B,$88,$86
  607.     DC.B $84,$83,$82,$81,$82,$83,$84,$86,$88,$8B,$8D,$8F,$90,$91,$91,$91
  608.     DC.B $90,$8F,$8D,$8B,$88,$86,$84,$83,$82,$81,$82,$83,$84,$86,$88,$8B
  609.     DC.B $8D,$8F,$90,$91,$91,$91,$90,$8F,$8D,$8B,$88,$86,$84,$83,$82,$81
  610.     DC.B $82,$83,$84,$86,$88,$8B,$8D,$8F,$90,$91,$91,$91,$90,$8F,$8D,$8B
  611.     DC.B $88,$86,$84,$83,$82,$81,$82,$83,$84,$86,$88,$8B,$8D,$8F,$90,$91
  612.     DC.B $91,$91,$90,$8F,$8D,$8B,$88,$86,$84,$83,$82,$81,$7F,$7E,$7D,$7C
  613.     DC.B $7A,$78,$75,$73,$71,$70,$6F,$6F,$6F,$70,$71,$73,$75,$78,$7A,$7C
  614.     DC.B $7D,$7E,$7F,$7E,$7D,$7C,$7A,$78,$75,$73,$71,$70,$6F,$6F,$6F,$70
  615.     DC.B $71,$73,$75,$78,$7A,$7C,$7D,$7E,$7F,$7E,$7D,$7C,$7A,$78,$75,$73
  616.     DC.B $71,$70,$6F,$6F,$6F,$70,$71,$73,$75,$78,$7A,$7C,$7D,$7E,$7F,$7E
  617.     DC.B $7D,$7C,$7A,$78,$75,$73,$71,$70,$6F,$6F,$6F,$70,$71,$73,$75,$78
  618.     DC.B $7A,$7C,$7D,$7E,$7F,$7E,$7D,$7C,$7A,$78,$75,$73,$71,$70,$6F,$6F
  619.     DC.B $6F,$70,$71,$73,$75,$78,$7A,$7C,$7D,$7E,$7F,$7E,$7D,$7C,$7A,$78
  620.     DC.B $75,$73,$71,$70,$6F,$6F,$6F,$70,$71,$73,$75,$78,$7A,$7C,$7D,$7E
  621.     DC.B $7F,$7E,$7D,$7C,$7A,$78,$75,$73
  622.  
  623. BEEPEND:
  624.  
  625. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  626. ;  IPC10 BEEP sound process... a short blip
  627.  
  628. BLIP:
  629.     DC.B $0A,$08,$AA,$AA,$55,$55
  630.     DC.B $01,$01,$00,$00,$00,$04,$00,$00
  631.  
  632. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  633.     END
  634.